#include <iostream>
using namespace std;

//原因分析：使用new创建对象时的原理：
//1. 调用operator new函数申请空间
//2. 在申请的空间上执行构造函数，初始化对象
//所以，虽然私有化了构造函数，不能直接创建堆对象，
//但是并没有阻止operator new函数开辟了指定类型对象大小的空间，
//然后用已创建的栈对象来初始化operator new函数开辟的空间以此形成堆对象。
//因此，若要严谨地实现只能在栈上创建对象的类（禁止创建堆对象），
//需要禁用类内重载的operator new函数

class StackOnly {
public:
	StackOnly() {} // 默认构造函数
	~StackOnly() {} // 默认析构函数
	
	//C++11:
	// 禁止 new 操作
	static void* operator new(size_t) = delete;
	
	// 禁止 delete 操作
	static void operator delete(void*) = delete;
	
//	// C++98:
//	// 私有化new 和 delete操作
//private:
//	static void* operator new(size_t);
//	static void* operator new[](size_t);
//	
//	static void operator delete(void*);
//	static void operator delete[](void*);
};

int main()
{
	StackOnly st;
	//StackOnly* pst = new StackOnly(); //err,无法直接创建堆对象
	//StackOnly* pst2 = new StackOnly(st); //err,也无法间接创建堆对象

	return 0;
}

